package torrent

// TorrentManager 种子管理器接口，定义了种子文件的所有操作方法
type TorrentManager interface {
	// EncodeTorrent msgpack编码种子文件结构，返回二进制数据
	EncodeTorrent(t *TorrentMeta) ([]byte, error)
	// DecodeTorrent 从msgpack二进制数据解码种子文件结构
	DecodeTorrent(data []byte) (*TorrentMeta, error)
	// SaveTorrent 保存种子文件，t为种子文件元信息，savePath为种子文件保存路径
	SaveTorrent(t *TorrentMeta, savePath string) error
	// LoadTorrent 加载种子文件，savePath为种子文件保存路径
	LoadTorrent(savePath string) (*TorrentMeta, error)
	// GenerateTorrent 生成种子文件，dir为目录路径，pieceLength为块大小
	GenerateTorrent(dir string, pieceLength int) (*TorrentMeta, error)
	// GenerateTorrentWithProgress 生成种子文件，dir为目录路径，pieceLength为块大小，progressCh为进度通道
	GenerateTorrentWithProgress(dir string, pieceLength int, progressCh chan<- float64) (*TorrentMeta, error)
	// VerifyTorrent 验证种子文件，t为种子文件元信息，parentDir为父目录路径
	VerifyTorrent(t *TorrentMeta, parentDir string) ([]string, error)
	// VerifyTorrentWithProgress 验证种子文件，t为种子文件元信息，parentDir为父目录路径，progressCh为进度通道
	VerifyTorrentWithProgress(t *TorrentMeta, parentDir string, progressCh chan<- float64) (*VerifyResult, error)
	// EqualHash 比较两个哈希值是否相等
	EqualHash(a, b Hash) bool
}

// torrentManagerImpl 种子管理器的具体实现结构体
type torrentManagerImpl struct{}

// NewTorrentManager 创建并返回一个新的种子管理器实例
func NewTorrentManager() TorrentManager {
	return &torrentManagerImpl{}
}
